package com.atguigu.jxc.service.impl;

import com.atguigu.jxc.dao.GoodsTypeDao;
import com.atguigu.jxc.domain.ErrorCode;
import com.atguigu.jxc.domain.ServiceVO;
import com.atguigu.jxc.domain.SuccessCode;
import com.atguigu.jxc.entity.GoodsType;
import com.atguigu.jxc.entity.GoodsTypeVo;
import com.atguigu.jxc.service.GoodsTypeService;
import com.atguigu.jxc.util.StringUtil;
import com.google.gson.Gson;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author ：Shine
 * @description：
 * @date ：2021/3/22 23:40
 */
@Service
public class GoodsTypeServiceImpl implements GoodsTypeService {
    @Autowired
    private GoodsTypeDao goodsTypeDao;

    @Override
    public String loadGoodsType() {
        List<GoodsType> allGoodsType = goodsTypeDao.selectAll();
        List<GoodsTypeVo> voList = allGoodsType.stream().map(goodsType -> {
            GoodsTypeVo goodsTypeVo = new GoodsTypeVo();
            goodsTypeVo.setId(goodsType.getGoodsTypeId());
            goodsTypeVo.setText(goodsType.getGoodsTypeName());

            if (goodsType.getGoodsTypeState() == 1) {
                goodsTypeVo.setState("closed");
            } else {
                goodsTypeVo.setState("open");
            }

            Map<String, Object> stateMap = new HashMap<>();
            stateMap.put("state", goodsType.getGoodsTypeState());
            goodsTypeVo.setAttribute(stateMap);
            goodsTypeVo.setPid(goodsType.getPId());
            return goodsTypeVo;
        }).collect(Collectors.toList());

        Map<Integer, List<GoodsTypeVo>> pidMap = voList.stream().collect(Collectors.groupingBy(GoodsTypeVo::getPid));
        for (GoodsTypeVo goodsTypeVo : voList) {
            goodsTypeVo.setChildren(pidMap.get(goodsTypeVo.getId()));
        }

        List<GoodsTypeVo> goodsTypeVoList = new ArrayList<>();
        goodsTypeVoList.addAll(pidMap.get(-1));

        Gson gson = new Gson();
        String json = gson.toJson(goodsTypeVoList);
        System.err.println(json);
        return json;
    }


    @Override
    public ServiceVO saveCategory(String goodsTypeName, Integer pId) {
        if (pId == null || StringUtil.isEmpty(goodsTypeName)) {
            return new ServiceVO(ErrorCode.PARA_TYPE_ERROR_CODE, ErrorCode.PARA_TYPE_ERROR_MESS);
        }

        GoodsType goodsType = goodsTypeDao.selectById(pId);
        GoodsType parent = goodsTypeDao.selectById(goodsType.getPId());
        if (parent != null) {
            if (parent.getPId() != -1 && goodsType.getPId() != -1) {
                return new ServiceVO(ErrorCode.PARA_TYPE_ERROR_CODE, ErrorCode.PARA_TYPE_ERROR_MESS);
            }
        }

        //设置默认展开状态为0
        goodsType = new GoodsType();
        goodsType.setGoodsTypeName(goodsTypeName);
        goodsType.setPId(pId);
        goodsType.setGoodsTypeState(0);
        goodsTypeDao.insert(goodsType);

        //设置父节点的展开状态为1
        goodsType = new GoodsType();
        goodsType.setGoodsTypeId(pId);
        goodsType.setGoodsTypeState(1);
        goodsTypeDao.updateGoodsTypeState(goodsType);

        return new ServiceVO(SuccessCode.SUCCESS_CODE, SuccessCode.SUCCESS_MESS);
    }

    @Override
    public ServiceVO remove(Integer goodsTypeId) {
        if (goodsTypeId == null) {
            return new ServiceVO(ErrorCode.PARA_TYPE_ERROR_CODE, ErrorCode.PARA_TYPE_ERROR_MESS);
        }

        goodsTypeDao.deleteById(goodsTypeId);

        return new ServiceVO(SuccessCode.SUCCESS_CODE, SuccessCode.SUCCESS_MESS);
    }
}
